Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

app/src/main/java/com/geeksville/mesh/model/UIState.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 10.11 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787com.geeksville.mesh.model

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.lifecycle.LiveData
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.asLiveData
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787androidx.navigation.NavHostController
Tff7b72import T7ee787com.geeksville.mesh.repository.radio.MeshActivity
Tff7b72import T7ee787com.geeksville.mesh.repository.radio.RadioInterfaceService
Tff7b72import T7ee787dagger.hilt.android.lifecycle.HiltViewModel
Tff7b72import T7ee787kotlinx.coroutines.channels.Channel
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.filterNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.launchIn
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.flow.mapNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.onEach
Tff7b72import T7ee787kotlinx.coroutines.flow.receiveAsFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.shareIn
Tff7b72import T7ee787org.jetbrains.compose.resources.getString
Tff7b72import T7ee787org.meshtastic.core.analytics.platform.PlatformAnalytics
Tff7b72import T7ee787org.meshtastic.core.data.repository.FirmwareReleaseRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.MeshLogRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.database.entity.MyNodeEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.asDeviceVersion
Tff7b72import T7ee787org.meshtastic.core.datastore.UiPreferencesDataSource
Tff7b72import T7ee787org.meshtastic.core.model.util.toChannelSet
Tff7b72import T7ee787org.meshtastic.core.service.IMeshService
Tff7b72import T7ee787org.meshtastic.core.service.MeshServiceNotifications
Tff7b72import T7ee787org.meshtastic.core.service.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.client_notification
Tff7b72import T7ee787org.meshtastic.core.ui.component.ScrollToTopEvent
Tff7b72import T7ee787org.meshtastic.core.ui.component.toSharedContact
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.proto.AdminProtos
Tff7b72import T7ee787org.meshtastic.proto.AppOnlyProtos
Tff7b72import T7ee787org.meshtastic.proto.MeshProtos
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787javax.inject.Inject

T8b949e// Given a human name, strip out the first letter of the first three words and return that as the
T8b949e// initials for
T8b949e// that user, ignoring emojis. If the original name is only one word, strip vowels from the original
T8b949e// name and if the result is 3 or more characters, use the first three characters. If not, just take
T8b949e// the first 3 characters of the original name.
Tff7b72fun Td2a8ffgetInitialsTb4b4b4(Te6edf3fullNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3maxInitialLength Tff7b72= T79c0ff4
Tff7b72val Te6edf3minWordCountForInitials Tff7b72= T79c0ff2
Tff7b72val Te6edf3name Tff7b72= Te6edf3fullNameTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3withoutEmojisTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3words Tff7b72= Te6edf3nameTb4b4b4.Te6edf3splitTb4b4b4(Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffs+Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}

Tff7b72val Te6edf3initials Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3wordsTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72in T79c0ff0 Te6edf3until Te6edf3minWordCountForInitials Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3nameWithoutVowels Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3nameTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3nameTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3nameTb4b4b4.Te6edf3dropTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3filterNot Tb4b4b4{ Te6edf3c Tff7b72-Tff7b72> Te6edf3cTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4) Tff7b72in Ta5d6ff"Ta5d6ffaeiouTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ff"
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3nameWithoutVowelsTb4b4b4.Te6edf3length Tff7b72>Tff7b72= Te6edf3maxInitialLengthTb4b4b4) Te6edf3nameWithoutVowels Tff7b72else Te6edf3name
Tb4b4b4}

Tff7b72else Tff7b72-Tff7b72> Te6edf3wordsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3initialsTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3maxInitialLengthTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3StringTb4b4b4.Td2a8ffwithoutEmojisTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3filterNot Tb4b4b4{ Te6edf3char Tff7b72-Tff7b72> Te6edf3charTb4b4b4.Te6edf3isSurrogateTb4b4b4(Tb4b4b4) Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLargeClassTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnusedPrivatePropertyTa5d6ff"Tb4b4b4)
Tf0883e@HiltViewModel
Tff7b72class T56d364UIViewModel
Tf0883e@Inject
Tff7b72constructorTb4b4b4(
Tff7b72private Tff7b72val Te6edf3appTb4b4b4: Te6edf3ApplicationTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeDBTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepositoryTb4b4b4,
Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Te6edf3meshLogRepositoryTb4b4b4: Te6edf3MeshLogRepositoryTb4b4b4,
Te6edf3firmwareReleaseRepositoryTb4b4b4: Te6edf3FirmwareReleaseRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3uiPreferencesDataSourceTb4b4b4: Te6edf3UiPreferencesDataSourceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3meshServiceNotificationsTb4b4b4: Te6edf3MeshServiceNotificationsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3analyticsTb4b4b4: Te6edf3PlatformAnalyticsTb4b4b4,
Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{

Tff7b72val Te6edf3themeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3uiPreferencesDataSourceTb4b4b4.Te6edf3theme

Tff7b72val Te6edf3firmwareEdition Tff7b72= Te6edf3meshLogRepositoryTb4b4b4.Te6edf3getMyNodeInfoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72> Te6edf3nodeInfoTff7b72?.Te6edf3firmwareEdition Tb4b4b4}

Tff7b72val Te6edf3clientNotificationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MeshProtosTb4b4b4.Te6edf3ClientNotificationTff7b72?Tff7b72> Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3clientNotification

Tff7b72fun Td2a8ffclearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3ClientNotificationTb4b4b4) Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Tb4b4b4)
Te6edf3meshServiceNotificationsTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4)
Tb4b4b4}

T8b949e/**
* Emits events for mesh network send/receive activity. This is a SharedFlow to ensure all events are delivered,
* even if they are the same.
*/
Tff7b72val Te6edf3meshActivityTb4b4b4: Te6edf3SharedFlowTff7b72<Te6edf3MeshActivityTff7b72> Tff7b72=
Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3meshActivityTb4b4b4.Te6edf3shareInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4, T79c0ff0Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3scrollToTopEventChannel Tff7b72= Te6edf3ChannelTff7b72<Te6edf3ScrollToTopEventTff7b72>Tb4b4b4(Te6edf3capacity Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3CONFLATEDTb4b4b4)
Tff7b72val Te6edf3scrollToTopEventFlowTb4b4b4: Te6edf3FlowTff7b72<Te6edf3ScrollToTopEventTff7b72> Tff7b72= Te6edf3scrollToTopEventChannelTb4b4b4.Te6edf3receiveAsFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffemitScrollToTopEventTb4b4b4(Te6edf3eventTb4b4b4: Te6edf3ScrollToTopEventTb4b4b4) Tb4b4b4{
Te6edf3scrollToTopEventChannelTb4b4b4.Te6edf3trySendTb4b4b4(Te6edf3eventTb4b4b4)
Tb4b4b4}

Tff7b72data Tff7b72class T56d364AlertDataTb4b4b4(
Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3messageTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3htmlTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3choicesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72> Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_currentAlertTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3AlertData?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3currentAlert Tff7b72= Te6edf3_currentAlertTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffshowAlertTb4b4b4(
Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3messageTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3htmlTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3dismissableTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3choicesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72> Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3_currentAlertTb4b4b4.Te6edf3value Tff7b72=
Te6edf3AlertDataTb4b4b4(
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3message Tff7b72= Te6edf3messageTb4b4b4,
Te6edf3html Tff7b72= Te6edf3htmlTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3dismissAlertTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3dismissableTb4b4b4) Te6edf3dismissAlertTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3choices Tff7b72= Te6edf3choicesTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffdismissAlertTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_currentAlertTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72val Te6edf3meshServiceTb4b4b4: Te6edf3IMeshService?
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3meshService

Tff7b72val Te6edf3unreadMessageCount Tff7b72=
Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountTotalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= T79c0ff0Tb4b4b4)

T8b949e// hardware info about our local device (can be null)
Tff7b72val Te6edf3myNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MyNodeEntity?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3myNodeInfo

Tff7b72init Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3errorMessage
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3onEach Tb4b4b4{
Te6edf3showAlertTb4b4b4(
Te6edf3title Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3client_notificationTb4b4b4)Tb4b4b4,
Te6edf3message Tff7b72= Tffa657itTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3clearErrorMessageTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)

Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffViewModel createdTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3_sharedContactRequestedTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTff7b72?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3sharedContactRequestedTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTff7b72?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_sharedContactRequestedTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetSharedContactRequestedTb4b4b4(Te6edf3urlTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3onFailureTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3runCatching Tb4b4b4{ Te6edf3_sharedContactRequestedTb4b4b4.Te6edf3value Tff7b72= Te6edf3urlTb4b4b4.Te6edf3toSharedContactTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3onFailure Tb4b4b4{ Te6edf3ex Tff7b72-Tff7b72>
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Te6edf3exTb4b4b4, Ta5d6ff"Ta5d6ffShared contact errorTa5d6ff"Tb4b4b4)
Te6edf3onFailureTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/** Called immediately after activity observes requestChannelUrl */
Tff7b72fun Td2a8ffclearSharedContactRequestedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_sharedContactRequestedTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

T8b949e// Connection state to our radio device
Tff7b72val Te6edf3connectionState
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionState

Tff7b72private Tff7b72val Te6edf3_requestChannelSet Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3requestChannelSetTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_requestChannelSet

Tff7b72fun Td2a8ffrequestChannelUrlTb4b4b4(Te6edf3urlTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3onFailureTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72=
Te6edf3runCatching Tb4b4b4{ Te6edf3_requestChannelSetTb4b4b4.Te6edf3value Tff7b72= Te6edf3urlTb4b4b4.Te6edf3toChannelSetTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3onFailure Tb4b4b4{ Te6edf3ex Tff7b72-Tff7b72>
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Te6edf3exTb4b4b4, Ta5d6ff"Ta5d6ffChannel url errorTa5d6ff"Tb4b4b4)
Te6edf3onFailureTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3latestStableFirmwareRelease Tff7b72= Te6edf3firmwareReleaseRepositoryTb4b4b4.Te6edf3stableReleaseTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTff7b72?.Te6edf3asDeviceVersionTb4b4b4(Tb4b4b4) Tb4b4b4}

T8b949e/** Called immediately after activity observes requestChannelUrl */
Tff7b72fun Td2a8ffclearRequestChannelUrlTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_requestChannelSetTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffViewModel clearedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3tracerouteResponseTb4b4b4: Te6edf3LiveDataTff7b72<Tffa657String?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3serviceRepositoryTb4b4b4.Te6edf3tracerouteResponseTb4b4b4.Te6edf3asLiveDataTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffclearTracerouteResponseTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3clearTracerouteResponseTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3appIntroCompletedTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3uiPreferencesDataSourceTb4b4b4.Te6edf3appIntroCompleted

Tff7b72fun Td2a8ffonAppIntroCompletedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3uiPreferencesDataSourceTb4b4b4.Te6edf3setAppIntroCompletedTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4}

Tf0883e@Composable
Tff7b72fun Td2a8ffAddNavigationTrackingEffectTb4b4b4(Te6edf3navControllerTb4b4b4: Te6edf3NavHostControllerTb4b4b4) Tb4b4b4{
Te6edf3analyticsTb4b4b4.Te6edf3AddNavigationTrackingEffectTb4b4b4(Te6edf3navControllerTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s